# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：4.12 字典的使用.py
# 开发时间：2021/3/23 13:33

print('字典的使用')
'''
创建字典：{'key1':'value1',...} and dict(key=value,...) or dict([('name', 'momo'),...])
'''
# 方法一：使用{}
# 语法：
# dict = {'key1':'value1', 'key2':'value2', 'key3':'value3', ...}

# 方法二：使用dict()函数
# 每一个参数都是一个key-value，参数名就是key，参数值就是value(这种方式创建的字典，key都是字符串格式)
d = dict(name = 'momo', age = 18, gender = '女')

# 也可以将一个包含有双值子序列的序列转换为字典
# 双值序列，序列中只有两个值，如['key', 'value']，或者('key2', 'value2')，又或者'kv'
# 子序列，如果序列中的元素也是序列（嵌套序列）那么此元素为子序列，如[('key', 'value'), ('key2', 'value2')]
# 如果一个序列s中，所有元素都是双值子序列x，就可以将该序列s转换为字典d
d = dict([('name', 'momo'), ('age', 18), ('gender', 'female')])
print(d, type(d))

'''
获取value：d['key'] or d.get('key')
'''
# 获取dict中的value，需要根据key获取
# 语法：dict['key']
print(d['name'])  # 因为此处的key是str，所有必须加''
# 通过['key']获取value时，若key不存在，则会报错

# get(key[, default]) 该方法用法，根据key，获取dict中的value
print(d.get('name'))
print(d.get('hello')) # 无key时，返回None，不会报错，get()比[]好
# print(d.get('name', 'default: 字典中无该key'))
# print(d.get('hello', 'default: 字典中无该key'))  # 默认值的用法:指定默认值，在获取不到key时返回提示字符串

'''
更新字典：d[key]=value  or  setdefault  or  update
'''
# d[key] = value 如果key存在则覆盖，不存在则添加
d['name'] = 'maomao'  # 修改字典中的key-value
d['address'] = '广州'  # 向字典中添加key-value
# print(d)

# d.setdefualt(key[, default])向字典中添加key-value
# 如果key已经存在于字典中，则返回key的值，不会对字典做任何操作
# 如果key不存在，则向字典中添加此key，并设置value
# result = d.setdefault('name', '毛毛')
result = d.setdefault('othername', '毛毛')
print('result = ', result)
print(d)

# update([other])
# 将其他dict中的key-value添加到当前dict中
# d1 = dict(a=1, b=2, c=3)
# d2 = dict(d=4, e=5, f=6)
# d1.update(d2)
# print(d1)
# 如果有重复的key，新value就会覆盖旧value

'''
删除key-value：del poptiem() pop(key) clear()
'''
# 可用del，删除dict中的key-value
# print(d)
# del d['othername']

# popitem()
# 随机删除字典中的一个key-value，默认情况下，删除最后一个键值对
# 删除之后，返回被删除的key-value，返回的格式为tuple元组('key', 'value')
# 当删除一个空字典，popitem()会报错
# result = d.popitem()  # 当d是空字典，popitem会报错
# print(result, type(result))  # <class 'tuple'>

# d.pop(key[, default])
# 根据key删除字典中的key-value
# 删除之后，返回被删除的value，返回的格式是字符串
# 当删除一个不存在的key，不声明default值就会报错
# result = d.pop('othername')
# print(result, type(result))   # <class 'str'>
# result = d.pop('other')  # KeyError: 'other' 删除不存在的key会报错
# result = d.pop('other', '没有此key，删除失败')  #  声明了默认值就不会报错
# print(result, type(result))   # <class 'str'>

# clear()用来清空dict
# d.clear()
print(d)

'''
其他函数 ：len()     in    not in    copy()
'''
# 对字典使用len()函数，返回值为字典中key-value对的个数
print(len(d))

# in, not in, in检查dict中是否包含指定的key，not in 相反
print('name' in d)  # True
print('hello' in d)  # False

# copy() 对字典进行浅复制
# 浅复制只会复制对象里面的value，不会复制对象的id
# 复制以后的对象，和原对象是独立的，修改复制后的c2，不会修改c1
c1 = dict(key=1, key2=2)
c2 = dict(key=3, key2=4)
print(c1, id(c1))
print(c2, id(c2))
# print("# 传统意义的复制,c2 c1 指向同一个对象")
# c2 = c1
# print(c1, id(c1))
# print(c2, id(c2))
print("# copy()函数的浅复制，只复制了value，没复制id，创建了个新对象")
c2 = c1.copy()
print(c1, id(c1))
print(c2, id(c2))

